home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / c / egem_210 / egem / example / dialdemo / dialdemo.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  23KB  |  708 lines

  1.  
  2. /* Dialog-Beispielprogramm zur EnhancedGEM-Library Version 2.10
  3.    (c) 1994 C. Grunenberg (läuft nur als Programm) */
  4.  
  5. #include <e_gem.h>
  6. #include <string.h>
  7. #include <time.h>
  8.  
  9. #include "scroller.c"
  10. #include "dialdemo.h"
  11.  
  12. /* Makro zum einfacheren Ermitteln der X_TEXT-Struktur */
  13. #define get_xtext(tree,obj)    ((X_TEXT *) tree[obj].ob_spec.userblk->ub_parm)
  14.  
  15. char *rsc = "dialdemo.rsc";
  16. char *entry = "  DialDemo";
  17. char *xacc_name = "DialogDemo";
  18. char *av_name = "DIALDEMO";
  19.  
  20. char *title = "DialogDemo";            /* Fenstertitel */
  21. char *chg_title = "* DialogDemo";    /*  - " - nach Veränderung */
  22. char *small_title = "DialDemo";        /*  - " - im ikonifizierten Zustand */
  23.  
  24. /* Text für die Beispiel-Alert-Box */
  25. char *alert_text = 
  26. "_ Erweiterte Alertboxen: ||"\
  27. " Diese können bis zu 16 Zeilen Text sowie|"\
  28. " 5 Buttons, welche über Hotkeys bedient|"\
  29. " werden können, enthalten.|"\
  30. " Neben 18 vordefinierten Icons können auch|"\
  31. " benutzerdefinierte Icons beliebiger Größe|"\
  32. " verwendet werden.||"\
  33. "!@      Zusätzlich kann jede Zeile mit|"\
  34. "~      Textattributen versehen werden!";
  35.  
  36. /* benötigte Prototypen */
  37. void HandleDialog(void);
  38. void do_alert(OBJECT *,int,int,int,int);
  39. void do_help(OBJECT *,int,int,int,int);
  40. void val_2_str(char *dest,long val);
  41.  
  42. /* Hilfetext und benötigte Variablen/Strukturen */
  43. extern char *help[];
  44. extern int help_lines,line_help_h,view_help_lines;
  45. extern int old_line,first_line,scroll_help;
  46. extern USERBLK helpblk;
  47.  
  48. /* Zeiger auf Objektbäume sowie DIAINFO-Strukturen für Dialoge */
  49.  
  50. DIAINFO *ex_info;        /* aktueller Dialog nach X_Form_Do */
  51. OBJECT *icon_tree;        /* benutzer-definiertes Alert-Box-Icon */
  52. OBJECT *menu;            /* Drop-Down-Menü */
  53.  
  54. OBJECT *dialog_tree, *help_tree, *text_tree, *demo_tree;
  55. OBJECT *alerts_tree, *frames_tree, *edit_tree, *xacc_tree;
  56. DIAINFO dialog_info, help_info, text_info, demo_info;
  57. DIAINFO alerts_info, frames_info, edit_info, xacc_info;
  58.  
  59. /* Struktur für Popup-Funktion initialisieren */
  60. POPUP pop = { &dialog_info,0l,POPINFO,POPBTN,POPCYCLE,TRUE,TRUE };
  61.  
  62. /* System-Zeit bei Programmstart (in Milisekunden) */
  63. long start_time;                
  64.  
  65. /* Zeitpunkt des letzten Timer-Events (- " -) */
  66. long last_timer2,last_timer3,last_timer4;
  67.  
  68. /* Buffer für Text-Scroller */
  69. char scroller[] = "                                     ";
  70. int scroll_pos = 0;        /* Position des Text-Scrollers */
  71.  
  72. /* Hotkeys für Slider */
  73.  
  74. SLKEY sl_help_keys[] = {
  75. { sl_key(SCANUP,0), 0, SL_UP },
  76. { sl_key(SCANDOWN,0), 0, SL_DOWN },
  77. { sl_key(SCANUP,0), K_RSHIFT|K_LSHIFT, SL_PG_UP },
  78. { sl_key(SCANDOWN,0), K_RSHIFT|K_LSHIFT , SL_PG_DN },
  79. { sl_key(SCANUP,0), K_CTRL, SL_START },
  80. { sl_key(SCANDOWN,0), K_CTRL, SL_END },
  81. { sl_key(SCANHOME,0), 0, SL_START },
  82. { sl_key(SCANHOME,0), K_RSHIFT|K_LSHIFT, SL_END} };
  83.  
  84. SLKEY sl_alert_keys[] = {
  85. { sl_key(SCANLEFT,0), 0, SL_UP },
  86. { sl_key(SCANRIGHT,0), 0, SL_DOWN },
  87. { sl_key(CTRLLEFT,0), K_CTRL, SL_START },
  88. { sl_key(CTRLRIGHT,0), K_CTRL, SL_END }};
  89.  
  90. /* Strukturen für Slider im Hilfe-Dialog */
  91. SLINFO sl_help = {&help_info,HELPPAR,HELPSLID,HELPUP,HELPDOWN,0,0,0,VERT_SLIDER,SL_LINEAR,100,0,do_help,&sl_help_keys[0],8},
  92.        *sl_help_list[] = {&sl_help,NULL};
  93.  
  94. /* Strukturen für Slider im Alert-Dialog */
  95. SLINFO sl_alert = {&alerts_info,PARENT,SLIDE,LEFT,RIGHT,0,0,X_ICN_MAX+2,HOR_SLIDER,SL_LINEAR,100,0,do_alert,&sl_alert_keys[0],4},
  96.        *sl_alert_list[] = {&sl_alert,NULL};
  97.  
  98. /***********************************************************************
  99.  Funktionen werden von graf_rt_slider() aufgerufen, sobald sich die
  100.  Sliderposition geändert hat. Dadurch können entsprechende Objekte neu
  101.  gezeichnet oder gesetzt werden
  102. ************************************************************************/
  103.  
  104. void do_alert(OBJECT *obj,int pos,int prev,int max_pos,int top)
  105. {
  106.     reg char *text=ob_get_text(obj,0,0);
  107.     reg int val=pos;
  108.  
  109.     /* Slider-Wert in String umrechnen */
  110.     if (val==0)
  111.         strcpy(text,"None");
  112.     else if (val==(X_ICN_MAX+2))
  113.         strcpy(text,"User");
  114.     else
  115.         val_2_str(text,val);
  116. }
  117.  
  118. void do_help(OBJECT *obj,int pos,int prev,int max_pos,int top)
  119. {
  120.     old_line = prev;
  121.     first_line = pos;
  122.     scroll_help = TRUE;
  123.     ob_draw_chg(&help_info,HELPVIEW,NULL,FAIL,top);
  124.     scroll_help = 0;
  125. }
  126.  
  127. /***********************************************************************
  128.  Long-Wert in Dezimal-String konvertieren
  129. ***********************************************************************/
  130.  
  131. long digits[] = {10000,1000,100,10};
  132.  
  133. void val_2_str(char *dest,long val)
  134. {
  135.     reg long *d = digits,x;
  136.     reg int i,all = FALSE;
  137.  
  138.     for (i=0;i<4;i++)
  139.     {
  140.         x = *d++;
  141.         if (all || val>=x)
  142.         {
  143.             *dest++ = val/x + '0';
  144.             val %= x;
  145.             all = TRUE;
  146.         }
  147.     }
  148.  
  149.     *dest++ = val + '0';
  150.     *dest++ = '\0';
  151. }
  152.  
  153. /***********************************************************************
  154.  Objekte des Xacc/AV-Dialoges setzen und neuzeichnen
  155. ***********************************************************************/
  156.  
  157. void set_xacc_av(void)
  158. {
  159.     reg XAcc *xacc;
  160.     reg int first,xacc_cnt=0,av_cnt=0;
  161.     static int list[] = {XACCCNT,AVCNT,AVSERVER,0};
  162.  
  163.     /* erste Applikation suchen */
  164.     first = 1;
  165.     while ((xacc=find_app(first))!=NULL)
  166.     {
  167.         /* XAcc-Applikation? */
  168.         if (xacc->flag & XACC)
  169.             xacc_cnt++;
  170.         /* AV-Applikation? */
  171.         if (xacc->flag & AV)
  172.             av_cnt++;
  173.         /* nächste Applikation suchen */
  174.         first=0;
  175.     }
  176.  
  177.     val_2_str(ob_get_text(xacc_tree,XACCCNT,0),xacc_cnt);
  178.     val_2_str(ob_get_text(xacc_tree,AVCNT,0),av_cnt);
  179.  
  180.     ob_set_text(xacc_tree,AVSERVER,(AvServer>=0) ? "AV-Server vorhanden" : "Kein AV-Server");
  181.  
  182.     /* ...und Objekte neuzeichnen, sofern Dialog geöffnet */
  183.     ob_draw_list(&xacc_info,list,NULL);
  184. }
  185.  
  186. /***********************************************************************
  187.  Alle Dialoge schließen sowie optional Beenden der Applikation
  188.  (Menüleiste löschen, Resource freigeben, Abmeldung bei AES und VDI)
  189. ***********************************************************************/
  190.  
  191. void ExitExample(int all)
  192. {
  193.     /* alle geöffneten Dialoge schließen */
  194.     close_all_dialogs();
  195.  
  196.     if (all)
  197.         /* Menüleiste entfernen, Resource freigeben, Abmeldung bei AES, VDI
  198.            und Protokollen und Programm beenden */
  199.         close_rsc(0);
  200. }
  201.  
  202. /***********************************************************************
  203.  Resource und Objektbäume initialsieren
  204. ***********************************************************************/
  205.  
  206. void init_resource(void)
  207. {
  208.     X_TEXT *text;
  209.     OBJECT *obj;
  210.     int i;
  211.  
  212. /* Adressen der Objektbäume (Dialoge,Menüs,Popups) ermitteln */
  213.     rsrc_gaddr(R_TREE, POP, &pop.p_menu);        /* Popup-Menü */
  214.     rsrc_gaddr(R_TREE, MENU, &menu);            /* Pull-Down-Menü */
  215.     rsrc_gaddr(R_TREE, EGEMICON, &iconified);    /* ikonifizierte Darstellung */
  216.     rsrc_gaddr(R_TREE, INFODIAL, &demo_tree);
  217.     rsrc_gaddr(R_TREE, DIALOG, &dialog_tree);
  218.     rsrc_gaddr(R_TREE, TEXTDIAL, &text_tree);
  219.     rsrc_gaddr(R_TREE, ALERTS, &alerts_tree);
  220.     rsrc_gaddr(R_TREE, RAHMEN, &frames_tree);
  221.     rsrc_gaddr(R_TREE, EDITDEMO, &edit_tree);
  222.     rsrc_gaddr(R_TREE, HELPDIAL, &help_tree);
  223.     rsrc_gaddr(R_TREE, ALERTICN, &icon_tree);
  224.     rsrc_gaddr(R_TREE, XACCDEMO, &xacc_tree);
  225.  
  226. /* erweiterte Objekte sowie Images/Icons anpassen */
  227.     for (i=0;i<=XACCDEMO;i++)
  228.     {
  229.         rsrc_gaddr(R_TREE, i, &obj);
  230.         fix_objects(obj,TEST_SCALING|DARK_SCALING,8,16);
  231.     }
  232.  
  233. /*  Zeichensatz und Größe des GDOS-Attribut-Texts setzen */
  234.     text = get_xtext(text_tree,GDOSTEXT);
  235.     text->font_id = 0;
  236.     text->font_size = -9;
  237.  
  238. /*  VDI-Schreibmodus des XOR-Textes setzen */
  239.     get_xtext(text_tree,XORTEXT)->mode = MD_XOR;
  240.  
  241. /*  Text-Scroller setzen */
  242.     ob_set_text(demo_tree,SCROLLER,scroller);
  243.  
  244. /* Erstellungsdatum und Versionsnummer im Informationsdialog setzen */
  245.     ob_set_text(demo_tree,DATE,__DATE__);
  246.     strcpy(ob_get_text(demo_tree,VERS,FALSE)+8,E_GEM_VERSION);
  247.  
  248. /* Hilfe-Dialog auf benutzerdefiniertes Objekt setzen */
  249.     obj = &help_tree[HELPVIEW];
  250.     obj->ob_type = G_USERDEF;
  251.     obj->ob_spec.userblk = &helpblk;
  252.  
  253. /* Slider-Struktur und benötigte Variablen zur Darstellung setzen  */
  254.     i = obj->ob_height;
  255.     line_help_h = gr_sh+2;
  256.     sl_help.sl_page = view_help_lines = (i/line_help_h)-1;
  257.     sl_help.sl_max = help_lines;
  258.  
  259. /* Koordinaten des Fenster-Objektes anpassen */
  260.     obj->ob_y += (i - (obj->ob_height = view_help_lines*line_help_h))>>1;
  261.  
  262. /* Koordinaten der Slider-Objekte anpassen */
  263.  
  264.     help_tree[HELPUP].ob_x -= 2;
  265.     help_tree[HELPUP].ob_y += 2;
  266.  
  267.     help_tree[HELPDOWN].ob_x -= 2;
  268.     help_tree[HELPDOWN].ob_y -= 2;
  269.  
  270.     obj = &help_tree[HELPPAR];
  271.     obj->ob_x -= 2;
  272.     obj->ob_y = help_tree[HELPUP].ob_y + help_tree[HELPUP].ob_height + 1;
  273.     obj->ob_height = help_tree[HELPDOWN].ob_y - obj->ob_y;
  274.  
  275. /* Help-Slider-Objekte initialisieren */
  276.     graf_set_slider(&sl_help,help_tree,GRAF_SET);
  277.  
  278. /* Alertbox-Slider-Objekte initialisieren */
  279.     graf_set_slider(&sl_alert,alerts_tree,GRAF_SET);
  280.     do_alert(&alerts_tree[SLIDE],sl_alert.sl_pos,0,0,0);
  281.  
  282. /* XAcc/AV-Dialogobjekte initialisieren */
  283.     set_xacc_av();
  284.  
  285. /* (Eingabe-) Felder in verschiedenen Dialogen zurücksetzen */
  286.     ob_clear_edit(dialog_tree);
  287.     ob_clear_edit(edit_tree);
  288.  
  289.     ob_get_text(xacc_tree,TIMEDEMO,TRUE);
  290. }
  291.  
  292. /***********************************************************************
  293.  Dialog öffnen und in Liste der geöffneten Dialoge eintragen bzw. falls
  294.  der Dialog schon geöffnet ist, diesen in den Vordergrund bringen.
  295. ***********************************************************************/
  296.  
  297. void OpenDialog(DIAINFO *info,OBJECT *tree,int dial_mode)
  298. {
  299.     reg SLINFO **slider = NULL;
  300.     reg char *name = title,*icon_name = small_title;
  301.     reg int center = TRUE;
  302.  
  303.     switch (info->di_flag)
  304.     {
  305.     /* Fensterdialog bereits geöffnet ? */
  306.     case WINDOW:
  307.     case WIN_MODAL:
  308.         /* Dialog in den Vordergrund holen */
  309.         window_top(info->di_win);
  310.         break;
  311.     /* Dialog geschlossen ? */
  312.     case CLOSED:
  313.         /* Dialog öffnen (zur Mausposition, keine Grow-Boxen) */
  314.         if (info==&help_info)
  315.         {
  316.             icon_name = name = "Hilfe";
  317.             slider = sl_help_list;
  318.         }
  319.         else if (info==&xacc_info)
  320.         { /* XAcc/AV-Info-Dialog in linker, oberer Desktop-Ecke öffnen */
  321.             xacc_tree->ob_x = desk.g_x+2;
  322.             xacc_tree->ob_y = desk.g_y+2;
  323.             center = FAIL;
  324.         }
  325.         else if (info==&alerts_info)
  326.             slider = sl_alert_list;
  327.  
  328.         if (open_dialog(tree,info,name,icon_name,NULL,center,FALSE,dial_mode,0,slider)==FALSE)
  329.             /* Dialog konnte nicht geöffnet werden (z.B. keine Fenster mehr ver-
  330.                fügbar */
  331.             xalert(1,1,X_ICN_ERROR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"Keine freien Fenster mehr!","[Ok");
  332.         else if (info==&help_info)
  333.             /* ansonsten Info-Zeile des Hilfe-Dialogs setzen */
  334.             window_info(help_info.di_win," Ein Fensterdialog mit Infozeile und Echtzeitschieber...");
  335.     }
  336.  
  337.     /* Verwaltung der geöffneten Dialoge u. Auswertung der Benutzeraktionen */
  338.     HandleDialog();
  339. }
  340.  
  341. /***********************************************************************
  342.  Menüauswertungsroutine, welche bei Bedarf den zu einem Hotkey gehörenden
  343.  Menüpunkt ermittelt und die zu diesem Menüpunkt gehörende Funktion aus-
  344.  führt
  345. ***********************************************************************/
  346.  
  347. /* Struktur, welche die vorhandenen Menüpunkte (bzw. Buttons im Haupt-
  348.    dialog) sowie die dazugehörigen Dialoge definiert */
  349.  
  350. typedef struct
  351. {
  352.     int    object,shortcut,state;    /* Menüeintrag, Hotkeytaste, -status */
  353.     DIAINFO *info;                /* Zeiger auf DIAINFO-Struktur des Dialogs */
  354.     OBJECT **tree;                /* Zeiger auf Objektbaum */
  355.     int mode;                    /* Art des Dialogs */
  356. } MENUITEM;
  357.  
  358. MENUITEM items[] = {
  359. {INFOBOX, 'I', K_CTRL, &demo_info, &demo_tree, AUTO_DIAL},
  360. {QUIT, 'Q', K_CTRL, NULL, NULL, FAIL},
  361. {ATTRMENU, 'T', K_CTRL, &text_info, &text_tree, AUTO_DIAL},
  362. {EDITMENU, 'E', K_CTRL, &edit_info, &edit_tree, AUTO_DIAL},
  363. {ALRTMENU, 'A', K_CTRL, &alerts_info, &alerts_tree, AUTO_DIAL},
  364. {XACCMENU, 'X', K_CTRL, &xacc_info, &xacc_tree, WIN_DIAL},
  365. {TITLMENU, 'R', K_CTRL, &frames_info, &frames_tree, AUTO_DIAL},
  366. {FLYMENU, 'F', K_CTRL, &dialog_info, &dialog_tree, FLY_DIAL},
  367. {WINMENU, 'D', K_CTRL, &dialog_info, &dialog_tree, WIN_DIAL},
  368. {MODMENU, 'M', K_CTRL, &dialog_info, &dialog_tree, WIN_DIAL|MODAL},
  369. {HELPMENU, 'H', K_CTRL, &help_info, &help_tree, WIN_DIAL|WD_INFO}
  370. };
  371.  
  372. #define ITEMS sizeof(items)
  373.  
  374. int MenuSelect(int object,int scan,int state)
  375. {
  376.     reg MENUITEM *item=items;
  377.     reg int index,key;
  378.  
  379.     if (object<0)
  380.     {
  381.         /* Eintrag zu Tastatur-Ereignis ermitteln */
  382.         key = scan_2_ascii(scan,state);
  383.         for (index=0;index<ITEMS;index++,item++)
  384.             if (item->shortcut==key && item->state==state)
  385.                 break;
  386.     }
  387.     else
  388.     {
  389.         /* Eintrag zu Menüpunkt ermitteln */
  390.         for (index=0;index<ITEMS;index++,item++)
  391.             if (item->object==object)
  392.                 break;
  393.     }
  394.  
  395.     if (index>=ITEMS)
  396.         return (FALSE);    /* kein entsprechender Eintrag gefunden */
  397.  
  398.     /* Menüpunkte 'Fenster wechseln' und 'Fenster schließen' werden
  399.        inklusive der dazugehörigen Hotkeys automatisch verwaltet */
  400.  
  401.     if (item->object==QUIT)
  402.         ExitExample(1);    /* Applikation beenden */
  403.     else
  404.         OpenDialog(item->info,*item->tree,item->mode);    /* Dialog öffnen */
  405.  
  406.     return (TRUE);
  407. }
  408.  
  409. /***********************************************************************
  410.  Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen
  411. ***********************************************************************/
  412.  
  413. static int already_handling = FALSE;
  414.  
  415. void HandleDialog(void)
  416. {
  417.     reg int double_click,exit;
  418.  
  419.     /* Wird die Verwaltung bereits übernommen? */
  420.     if (already_handling)
  421.         return;
  422.     else
  423.         already_handling = TRUE;
  424.  
  425.     for (;;)
  426.     {
  427.         /* Auf Benutzeraktionen warten
  428.            exit -> angewähltes Objekt (Bit 15 = Doppelklick)
  429.            ex_info -> Zeiger auf DIAINFO-Struktur des angewählten Dialogs
  430.         */
  431.         exit = X_Form_Do(&ex_info);
  432.  
  433.         if (exit==W_CLOSED)
  434.             /* Fenster-Closer -> Dialog schließen */
  435.             close_dialog(ex_info,FALSE);
  436.         else if (exit==W_ABANDON)
  437.             /* Dialog wurde geschlossen, aber kein Objekt angewählt (z.B. AP_TERM),
  438.                oder es waren keine Dialoge mehr geöffnet */
  439.             break;
  440.         else
  441.         {
  442.             /* Doppelklick erfassen und aus Wert für Exit-Objekt ausmaskieren */
  443.             exit ^= (double_click = exit & 0x8000);
  444.  
  445.             /* angewähltes Objekt deselektieren und neu zeichnen */
  446.             ob_select(ex_info,ex_info->di_tree,exit,CLEAR_STATE,TRUE);
  447.  
  448.             /* Demonstrations-Dialog */
  449.             if (ex_info==&dialog_info)
  450.             {
  451.                 switch (exit)
  452.                 {
  453.                 /* Popup-Infotext/-button/-cycleobjekt angewählt */
  454.                 case POPINFO:
  455.                 case POPBTN:
  456.                 case POPCYCLE:
  457.                     /* Falls Cycle-Objekt angewählt wurde oder das Popup-Menü
  458.                        mit Alternate-Shift-Hotkey aufgerufen wurde, nächsten
  459.                        Eintrag ermitteln, ansonsten Popup aufrufen */
  460.                     Popup(&pop,(exit==POPCYCLE || double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
  461.                           OBJPOS,0,0,NULL,FAIL);
  462.                     if (dialog_info.di_flag==WINDOW && dialog_info.di_win->name==title)
  463.                         /* neue Titelzeile des unmodalen Dialogs setzen */
  464.                         window_name(dialog_info.di_win,chg_title,small_title);
  465.                     break;
  466.                 /* Hilfe-Button -> Hilfe-Dialog öffnen */
  467.                 case HELP:
  468.                     OpenDialog(&help_info,help_tree,WIN_DIAL|WD_INFO);
  469.                     break;
  470.                 /* Suchen-Button -> Warnung (Disketten-Fehler) ausgeben */
  471.                 case SEARCH:
  472.                     xalert(1,1,X_ICN_DISC_ERR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"Keine Datei gefunden!","[Ok");
  473.                     break;
  474.                 /* Ansonsten Dialog schließen */
  475.                 default:
  476.                     close_dialog(ex_info,FALSE);
  477.                 }
  478.             }
  479.             /* Alert-Boxen-Dialog */
  480.             else if (ex_info==&alerts_info && exit==DOALERT)
  481.             {
  482.                 /* Alertbox entsprechend den Einstellungen darstellen */
  483.                 BITBLK *user = NULL;
  484.                 int align,center,icon,modal;
  485.  
  486.                 /* einheitliche Button-Breite? */
  487.                 align = ob_isstate(alerts_tree,BTNWIDTH,SELECTED);
  488.  
  489.                 /* System-modale Alert-Box ? */
  490.                 modal = ob_isstate(alerts_tree,SYSMODAL,SELECTED) ? SYS_MODAL : APPL_MODAL;
  491.  
  492.                 /* Ausrichtung der Buttons */
  493.                 center = ob_radio(alerts_tree,ALERTOPT,FAIL);
  494.  
  495.                 /* gewünschtes Icon */
  496.                 icon = sl_alert.sl_pos;
  497.                 if (icon==0)
  498.                     icon = FAIL;    /* kein Icon */
  499.                 else if (icon==X_ICN_MAX+2)
  500.                 {
  501.                     /* benutzerdefiniertes Icon */
  502.                     icon = FAIL;
  503.                     user = icon_tree[USERICON].ob_spec.bitblk;
  504.                 }
  505.                 else
  506.                     icon--;
  507.  
  508.                 xalert(2,1,icon,user,modal,center,align,(modal==SYS_MODAL) ? NULL : title,alert_text,"[Huh-Huh|[This sucks!");
  509.                 if (user)
  510.                     xalert(1,1,X_ICN_ERROR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"That was cool!","[Yeah!");
  511.             }
  512.             /* ansonsten Dialog schließen */
  513.             else
  514.                 close_dialog(ex_info,FALSE);
  515.         }
  516.     }
  517.  
  518.     already_handling = FALSE;
  519. }
  520.  
  521. /***********************************************************************
  522.  Initialisierungs-Routine, welche von X_Form_Do bzw. Event_Multi aufge-
  523.  rufen wird und die Event-Struktur setzt sowie die Ereignisse, die von der
  524.  Applikation benötigt werden, zurückgibt
  525. ***********************************************************************/
  526.  
  527. int InitMsg(XEVENT *evt,int events_available)
  528. {
  529.     /* auf Nachrichten und Tastendrücke warten */
  530.     reg int flags = MU_MESAG|MU_KEYBD;
  531.  
  532.     /* Protokoll-Dialog geöffnet und 2. Timer verfügbar? */
  533.     if (xacc_info.di_flag>CLOSED && (events_available & MU_TIMER2))
  534.     {
  535.         evt->ev_mt2count = 1000;        /* ein Event pro Sekunde */
  536.         evt->ev_mt2last = last_timer2;
  537.         flags |= MU_TIMER2;        /* auf 2. Timer-Event warten */
  538.     }
  539.  
  540.     /* Informations-Dialog geöffnet und 3/4. Timer verfügbar? */
  541.     if (demo_info.di_flag>CLOSED)
  542.     {
  543.         /* Farbe vorhanden? */
  544.         if ((events_available & MU_TIMER3) && colors>2)
  545.         {
  546.             evt->ev_mt3count = 1000/3;    /* 3 Events pro Sekunde */
  547.             evt->ev_mt3last = last_timer3;
  548.             flags |= MU_TIMER3;        /* auf 3. Timer-Event warten */
  549.         }
  550.  
  551.         if (events_available & MU_TIMER4)
  552.         {
  553.             evt->ev_mt4count = 1000/12;    /* 12 Events pro Sekunde */
  554.             evt->ev_mt4last = last_timer4;
  555.             flags |= MU_TIMER4;        /* auf 4. Timer-Event warten */
  556.         }
  557.     }
  558.  
  559.     /* benötigte und verfügbare Events zurückgeben */
  560.     return (flags & events_available);
  561. }
  562.  
  563. /***********************************************************************
  564.  Ereignisauswertung (AES-Nachrichten, Tastendrücke, Timer ), welche sowohl
  565.  von Event_Multi() als auch von X_Form_Do() aufgerufen wird
  566. ***********************************************************************/
  567.  
  568. int Messag(XEVENT *event)
  569. {
  570.     reg X_TEXT *text;
  571.     reg DIAINFO *info;
  572.     reg int ev = event->ev_mwich,*msg = event->ev_mmgpbuf;
  573.     reg int used = 0;
  574.  
  575.     /* 2. Timer-Event auswerten */
  576.     if (ev & MU_TIMER2)
  577.     {
  578.         last_timer2 = event->ev_mt2last;
  579.         val_2_str(ob_get_text(xacc_tree,TIMEDEMO,0),(last_timer2-start_time)/1000);
  580.         ob_draw(&xacc_info,TIMEDEMO);
  581.         used |= MU_TIMER2;    /* Timer ausgewertet */
  582.     }
  583.  
  584.     /* 3. Timer-Event auswerten */
  585.     if (ev & MU_TIMER3)
  586.     {
  587.         last_timer3 = event->ev_mt3last;
  588.         text = get_xtext(demo_tree,DEDICATE);
  589.         if (++text->color>=colors)
  590.             text->color = 1;
  591.         ob_draw(&demo_info,DEDICATE);
  592.         used |= MU_TIMER3;    /* Timer ausgewertet */
  593.     }
  594.  
  595.     /* 4. Timer-Event auswerten */
  596.     if (ev & MU_TIMER4)
  597.     {
  598.         last_timer4 = event->ev_mt4last;
  599.  
  600.         strcpy(&scroller[0],&scroller[1]);
  601.         scroller[sizeof(scroller)-2] = scroll_text[scroll_pos++];
  602.         if (scroll_pos>=sizeof(scroll_text))
  603.             scroll_pos = 0;
  604.  
  605.         ob_draw(&demo_info,SCROLLER);
  606.         used |= MU_TIMER4;    /* Timer ausgewertet */
  607.     }
  608.  
  609.     /* Nachricht vom AES ? */
  610.     if (ev & MU_MESAG)
  611.     {
  612.         /* Nachrichtenereignis wurde ausgewertet */
  613.         used |= MU_MESAG;
  614.  
  615.         switch (*msg)
  616.         {
  617.         /* Menüeintrag angeklickt ? */
  618.         case MN_SELECTED:
  619.             /* Menüeintrag deselektieren */
  620.             menu_select(msg[3],0);
  621.  
  622.             /* gewünschte Funktion ausführen */
  623.             if (MenuSelect(msg[4],0,0)==FALSE)
  624.                 /* Nachricht konnte nicht ausgewertet werden
  625.                    (sollte NIE vorkommen) */
  626.                 used &= ~MU_MESAG;
  627.             break;
  628.         /* Applikation beenden/rücksetzen */
  629.         case AP_TERM:
  630.             ExitExample(1);
  631.             break;
  632.         /* Applikation hat sich an- oder abgemeldet */
  633.         case XACC_AV_INIT:
  634.         case XACC_AV_EXIT:
  635.             set_xacc_av();
  636.             break;
  637.         /* Wurde eine Eingabe in einem Dialog vorgenommen oder ein
  638.            Objekt (de-) selektiert? */
  639.         case OBJC_CHANGED:
  640.         case OBJC_EDITED:
  641.             info = *(DIAINFO **) &msg[4];
  642.             if (info!=&help_info && info->di_flag==WINDOW && info->di_win->name==title)
  643.                 /* neue Titelzeile des unmodalen Dialogs setzen */
  644.                 window_name(info->di_win,chg_title,small_title);
  645.             break;
  646.         default:
  647.         /* unbekannte Nachricht konnte nicht ausgewertet werden */
  648.             used &= ~MU_MESAG;
  649.         }
  650.     }
  651.  
  652.     /* Tastatur-Ereignis auswerten */
  653.     if ((ev & MU_KEYBD) && MenuSelect(FAIL,event->ev_mkreturn,event->ev_mmokstate))
  654.         used |= MU_KEYBD;    /* Tastaturereignis wurde ausgewertet */
  655.  
  656.     return (used);
  657. }
  658.  
  659. void main()
  660. {
  661.     /* Wurde die Demo als Accessory gestartet? */
  662.     if (!_app)
  663.         exit(-1); /* Ja -> Demo beenden */
  664.  
  665.     /* Start-Zeit setzen */
  666.     last_timer2 = last_timer3 = last_timer4 = start_time = clock()*5;
  667.  
  668.     /* Resource-File laden und Bibliothek sowie AES und VDI initialisieren
  669.        (keine anwendungspezifische AV/VA/XAcc-Nachrichtenauswertung) */
  670.     if (open_rsc(rsc,entry,xacc_name,av_name,0,0,0)==TRUE)
  671.     {
  672.         /* Resource-Datei bzw. Objektbäume initialisieren */
  673.         init_resource();
  674.  
  675.         /* Routinen zur Ereignisauswertung anmelden */
  676.         Event_Handler(InitMsg,Messag);
  677.  
  678.         /* Hotkeys und Menüpunkte für Fenster wechseln/schließen setzen */
  679.         CycleCloseWindows('W','U',CYCLE,CLOSE);
  680.  
  681.         /* Dialog-Optionen setzen, u.a. Hintergrundbedienung von
  682.           Fensterdialogen u. Tastendrücke an Dialog unter Mauszeiger,
  683.           Return selektiert DEFAULT-Objekt bei letztem Eingabefeld */
  684.         dial_options(TRUE,TRUE,FALSE,TRUE,FAIL,TRUE,FALSE,FALSE,TRUE);
  685.  
  686.         /* Dialog-Farben und Füllmuster setzen */
  687.         dial_colors(7,(colors>=16) ? YELLOW : WHITE,GREEN,RED,MAGENTA,BLUE,CYAN,RED);
  688.  
  689.         title_options(FALSE,RED,FALSE);    /* Titel-Optionen setzen */
  690.         check_image(5,NULL);            /* Häkchen als Image für Check-Boxen */
  691.  
  692.         menu_install(menu,TRUE);        /* Pull-Down-Menü anmelden */
  693.  
  694.         /* XAcc/AV-Info-Dialog öffnen */
  695.         OpenDialog(&xacc_info,xacc_tree,WIN_DIAL);
  696.  
  697.         /* Auf Ereignis (Nachrichten/Tastendrücke) warten und dieses
  698.            auswerten. In diesem Fall werden die benötigten Events be-
  699.            reits durch die Funktionen InitMsg() und Messag() gesetzt und
  700.            ausgewertet. Zusätzlich könnte man natürlich hier noch wei-
  701.            tere Events angeben, die speziell ausgewertet werden, oder
  702.            den Event_Handler abmelden und alle Ereignisse hier auswerten.
  703.            Dann müßte man allerdings die Funktion Event_Multi in eine
  704.            Endlosschleife integrieren */
  705.         Event_Multi(NULL);    /* und los geht's */
  706.     }
  707. }
  708.